#ifndef __THREAD_H__
#define __THREAD_H__

#include "logger.h"

#include <pthread.h>
/*  int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
        void *(*start_routine) (void *), void *arg); */


//RAII思想
// one loop per thread模式

class Reactor;
class Controller;


class Thread {
private:
    pthread_t m_tid;
    int m_channel[2];   
    Reactor* m_reactor;  //<m_reactor不在构造函数里面初始化，在taskFunc里面初始化
                         //<构造函数的pthread_create只是创建了一个线程，这个线程的具体执行在taskFunc里面
                         //这就是pthread_create传this指针的原因，知道这个m_reactor属于哪一个线程对象
    Controller* m_ctroller; 
    //MVC中的c，map<>映射

public:
    static void* taskFunc(void* arg);   //<maim函数才是主线程，所以使用这个类创建的线程都是子线程
                                        //子线程主要处理两个事件：接受主线程发过来的cfd,  处理子线程里面cfd上的事件
                                        //这就是两个回调函数。

    static void SocketPairEventCallBack(int fd, short events, void* arg);  //接受主线程发过来的建立好连接的文件描述符
    static void ClientIOEventCallBack(int fd, short events, void* arg);    //建立好连接的文件描述符，就是与客户端的连接。这个链接上的业务
    Thread();
    ~Thread();

    int GetSocketPairFirst() const;     //< SocketPair的写
    int GetSocketPairSecond() const;    //< SocketPair的读
    pthread_t GetTid() const;           //<获取当前的线程id
};





#endif